package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.ui.Keyboard;

	public class Test4 extends Sprite {
		public var arr:Array; //储存下落字母的数组
		public var time:uint;
		public var angle:Number; 	   //这个变量是为了能让掉下的字母能做波形运动的
		public var errorTxt:TextField; //错误显示文本
		public var trueTxt:TextField;  //正确显示文本
		public var errorCount:int = 0; //错误总计变量
		public var trueCount:int = 0;  //正确总计变量


		public function Test4(){
			init();
		}

		public function init():void {
			this.addEventListener(Event.ENTER_FRAME, loopHandler); //帧事件
			stage.addEventListener(KeyboardEvent.KEY_DOWN, downHandler); //键盘事件
			
			arr = new Array();
			angle = 0;
			time = 0;
			
			errorTxt = new TextField();
			trueTxt = new TextField();
			errorTxt.text = "错误: " + errorCount;
			trueTxt.text = "正确: " + trueCount;
			errorTxt.x = 150;
			trueTxt.x = 300;
			this.addChild(errorTxt);
			this.addChild(trueTxt);
		}

		//判断，消除
		public function downHandler(event:KeyboardEvent):void {
			errorCount++;
			for (var i:Number = arr.length - 1; i >= 0; i--){
				//判断键盘按下的键值是否和场景里的字母符合.如果符合则消去
				if (arr[i].text == String.fromCharCode(event.keyCode)){
					this.removeChild(arr[i]);
					arr.splice(i, 1);
					trueCount++;
					errorCount--;
					break;
				}
			}
			errorTxt.text = "错误: " + errorCount;
			trueTxt.text = "正确: " + trueCount;
		}

		//帧事件，添加随机字母
		public function loopHandler(event:Event):void {
			time++;
			angle += 0.1;
			if (time >= 13){
				time = 0;
				
				//产生字母A~Z对应的ASCII码,用String的静态函数fromCharCode转换成字符
				var tf:TextField = new TextField();
				tf.text = String.fromCharCode(int(Math.random() * 26 + 65).toString()); //65-90
				//产生字符串不能刚刚好在舞台宽度上.在这个例子中舞台是宽度是550，那么这里产生的范围是在20~530之间
				tf.x = Math.random() * (40 - stage.stageWidth) + stage.stageWidth - 20;
				tf.y = -10;
				
				//tf.name是用来储存速度的.对应着第86行.这里这样的用法不提倡使用.
				tf.name = (Math.random() * -10 + 5).toString();
				tf.selectable = false;
				this.addChild(tf);
				tf.setTextFormat(new TextFormat("黑体", 25));
				//注意这里不是用push到尾部.而是使用了unshift放到了数组的第一位.
				//如果这里使用了push,那么键盘按下的时候.并不是消掉最先出现的字母.而是最后出现的.
				arr.unshift(tf);
			}
			
			//超出舞台错误加1，并移除
			for (var i:Number = arr.length - 1; i >= 0; i--){
				arr[i].y += 3;
				//arr[i].x+= Math.sin(angle)*int(arr[i].name);//打开这里的话,字母做波形运动
				if (arr[i].y >= stage.stageHeight){
					this.removeChild(arr[i]);
					arr.splice(i, 1);
					errorCount++;
					errorTxt.text = "错误: " + errorCount;
					break;
				}
			}
		}
	}
}